01|一条SQL查询语句是如何执行的

MySQL基础架构

连接器

负责与客户端建立连接。
shou processlist (查看连接)
长连接内存占用过大OOM如何解决:

  • 定期断开长连接
  • MySQL5.7以及以上版本,可以在执行完比较大的操作后,通过mysql_reset_connection重新初始化连接资源,使连接恢复到刚刚创建完时的状态。

查询缓存

建立连接后会优先查询缓存,查询缓存弊大于利,MySQL8.0将查询缓存删除。

  • 对于一张经常变更的表,缓存经常被清空,缓存的命中率非常低,对于静态表适合做查询缓存。
  • 按需使用查询缓存。

分析器(分析要做什么)

如何没有命中查询缓存,就要开始执行SQl语句了。

  • 词法分析:识别关键词,如select, from ,table….
  • 语法分析:根据语法规则判断SQL语句的正确性。

优化器(确定执行方案)

  • 当存在多个索引的时候,决定索引的选择
  • 多表关联的时候,决定多个表的连接顺序

    执行器

    根据选择的存储引擎调用引擎接口从第一行开始比对,直到最后一行找出所有满足条件的记录返回结果集。

  • 慢查询日志:rows_examined(语句执行过程中的扫描行)